import pandas as pd
import matplotlib.pyplot as plt

# 设置matplotlib以显示中文和负号
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 读取Excel文件
df = pd.read_excel('D:\\PyCharm 2022.3\\douban\\豆瓣电影top250数据.xlsx')

# 提取国家信息
countries_series = df['上映时间、电影类型'].str.extract('([\u4e00-\u9fff]+(?: [\u4e00-\u9fff]+)*)(?=/|$|，|\s+)')[0]

# 清理数据，去除空值，拆分并扩展
countries_expanded = countries_series.dropna().str.split('[/，]+').explode().reset_index(drop=True)

# 统计每个国家的电影数量
country_counts = countries_expanded.value_counts().reset_index()
country_counts.columns = ['国家', '电影数量']

# 计算总电影数量
total_movies = country_counts['电影数量'].sum()

# 确定1%的阈值
threshold = total_movies * 0.01

# 创建一个字典来存储更新后的数据
updated_counts = {}
other_count = 0

# 遍历国家统计数据，将小于阈值的国家电影数量累加到“其他”
for index, row in country_counts.iterrows():
    if row['电影数量'] < threshold:
        other_count += row['电影数量']
    else:
        updated_counts[row['国家']] = row['电影数量']

# 将“其他”添加到字典中
updated_counts['其他'] = other_count

# 将字典转换为DataFrame
updated_country_counts = pd.DataFrame.from_dict(updated_counts, orient='index', columns=['电影数量'])
updated_country_counts.reset_index(inplace=True)
updated_country_counts.columns = ['国家', '电影数量']

# 绘制饼图
plt.figure(figsize=(10, 8))
plt.pie(updated_country_counts['电影数量'], labels=updated_country_counts['国家'], autopct='%1.1f%%', startangle=140)
plt.title('豆瓣电影Top250中，拍摄的国家')
plt.axis('equal')  # 确保饼图是圆形的
plt.show()